// #include "global_config.h"
// #include "drv_ble.h"
// #include "public_datas.h"
// // #include "drv_adc.h"

// #define START_DEVICE_EVT 0x0001
// #define START_DISCOVERY_EVT 0x0002
// #define START_SCAN_EVT 0x0004
// #define START_ADD_WHITE_LIST 0x0008

// #define TAG "BLE"

// // static uint8 white_list_mac[6] = {0}; // 指定mac地址
// // uint8 mac1[6] = {0xD4, 0x4A, 0x41, 0x4C, 0xC6, 0x4C}; // 指定mac地址

// // uint8 mac1[6] = {0x02, 0x00, 0x00, 0xE4, 0xC2, 0x84};//指定mac地址

// // Maximum number of scan responses
// #define DEFAULT_MAX_SCAN_RES BLE_SCAN_MAX_RES

// // Scan duration in (625us)
// #define DEFAULT_SCAN_DURATION (BLE_SCAN_DURATION_MS * 1000 / 625)

// // Discovey mode (limited, general, all)
// #define DEFAULT_DISCOVERY_MODE DEVDISC_MODE_ALL // 扫描隐藏设备

// // TRUE to use active scan
// #define DEFAULT_DISCOVERY_ACTIVE_SCAN 1 // 是否请求扩展包


// static uint8_t ObserverTaskId = 0;
// static ble_scan_callback_t scan_callback = NULL;
// static uint16_t scan_time = SCAN_SLOW_TIME_MS;
// static uint8_t wirte_list_en = 0;
// static uint16_t scan_duration = DEFAULT_SCAN_DURATION;
// static ble_ee_datas_t *ble_ee_datas = NULL;
// static ble_cu_datas_t ble_cu_data;

// static void ObserverEventCB(gapRoleEvent_t *pEvent);
// static uint16_t Observer_ProcessEvent(uint8_t task_id, uint16_t events);

// static const char *ble_state_string[] = {
//     "BLE_STATE_IDLE",
//     "BLE_STATE_SCAN_SLOW",
//     "BLE_STATE_SCAN_FAST",
//     "BLE_STATE_SCAN_CONTINUOUS",
// };


// // void drv_ble_set_scan_time(uint16_t ms)
// // {
// //     scan_time = ms;
// // }

// static const gapRoleObserverCB_t ObserverRoleCB = {
//     ObserverEventCB // Event callback
// };

// ble_cu_datas_t *drv_ble_get_cu_datas()
// {
//     return &ble_cu_data;
// }

// ble_ee_datas_t *drv_ble_get_ee_datas()
// {
//     return ble_ee_datas;
// }

// static void chek_scan_paras()
// {
//     if (ble_cu_data.ble_scan_state == BLE_STATE_SCAN_SLOW)
//     {
// #if !BLE_CLOSE_WHITE_LIST
//         wirte_list_en = 1;
// #endif
//         scan_time = SCAN_SLOW_TIME_MS;
//     }
//     else if (ble_cu_data.ble_scan_state == BLE_STATE_SCAN_FAST)
//     {
// #if !BLE_CLOSE_WHITE_LIST
//         wirte_list_en = 1;
// #endif
//         scan_time = SCAN_FAST_TIME_MS;
//     }
//     else if (ble_cu_data.ble_scan_state == BLE_STATE_SCAN_CONTINUOUS)
//     {
//         scan_time = 1;
//         wirte_list_en = 0;
//     }

//     if (ble_cu_data.ble_scan_state != BLE_STATE_IDLE)
//     {
//         tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(scan_time));
//     }
// }

// ble_state_t drv_ble_get_state()
// {
//     return ble_cu_data.ble_scan_state;
// }

// static void update_white_list()
// {
//     uint8_t zero_array[6] = {0, 0, 0, 0, 0, 0};

//     GAPRole_ObserverCancelDiscovery();
//     LL_ClearWhiteList();

//     for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     {
//         if (memcmp(ble_ee_datas->white_list_mac[i], zero_array, 6))
//         {
//             LL_AddWhiteListDevice(0, ble_ee_datas->white_list_mac[i]);
//         }
//     }
//     if (ble_cu_data.ble_scan_state != BLE_STATE_IDLE)
//     {
//         tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(scan_time));
//     }
// }

// static void ee_datas_init()
// {
//     for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     {
//         if (public_api_chek_mac(ble_ee_datas->white_list_mac[i])) // 有mac地址
//         {
//             esay_logi(TAG, "ble white list mac | %02X:%02X:%02X:%02X:%02X:%02X",
//                       ble_ee_datas->white_list_mac[i][0],
//                       ble_ee_datas->white_list_mac[i][1],
//                       ble_ee_datas->white_list_mac[i][2],
//                       ble_ee_datas->white_list_mac[i][3],
//                       ble_ee_datas->white_list_mac[i][4],
//                       ble_ee_datas->white_list_mac[i][5]);
//             esay_logi(TAG, "this mac keep alive rssi | %d", ble_ee_datas->ble_alive_rssi[i]);
//             esay_logi(TAG, "this mac trig near rssi | %d", ble_ee_datas->ble_near_rssi[i]);
//             esay_logi(TAG, "this mac trig far rssi | %d", ble_ee_datas->ble_far_rssi[i]);

//             if (ble_ee_datas->near_control_mask[i] & 0x80) // 开启了靠近事件使能
//             {
//                 esay_logi(TAG, "this mac near trig control :");
//                 for (size_t j = 0; j < 7; j++)
//                 {
//                     if (ble_ee_datas->near_control_mask[i] & (1 << j))
//                     {
//                         esay_logo(" | %s", control_list[j]);
//                     }
//                 }
//                 esay_logo("\n");
//                 // datas.ble_cu_datas.ble_scan_state = BLE_STATE_SCAN_SLOW;
//             }
//             if (ble_ee_datas->far_control_mask[i] & 0x80) // 开启了远离事件使能
//             {
//                 esay_logi(TAG, "this mac far trig control :");
//                 for (size_t j = 0; j < 7; j++)
//                 {
//                     if (ble_ee_datas->far_control_mask[i] & (1 << j))
//                     {
//                         esay_logo("%s", control_list[j]);
//                     }
//                 }
//                 esay_logo("\n");
//                 // datas.ble_cu_datas.ble_scan_state = BLE_STATE_SCAN_SLOW;
//             }
//         }
//     }

//     // esay_logi(TAG, "ble scan mode | %s", ble_state_list[datas.ble_cu_datas.ble_scan_state]);

//     uint8_t zero_array[3] = {0, 0, 0};
//     for (size_t i = 0; i < 2; i++)
//     {
//         if (memcmp(ble_ee_datas->rssi_loc_list[i], zero_array, 3) != 0) // 有三角定位数据
//         {
//             for (size_t j = 0; j < 6; j++) // 有没有启用坐标点
//             {
//                 if (ble_ee_datas->rssi_loc_trig_pos[i][j] != 0) // 启用了坐标点
//                 {
//                     if (j % 2)
//                     {
//                         esay_logi(TAG, "rssi location trig pos x,y | %d,%d",
//                                   ble_ee_datas->rssi_loc_trig_pos[i][j - 1],
//                                   ble_ee_datas->rssi_loc_trig_pos[i][j]);
//                     }
//                     else
//                     {
//                         esay_logi(TAG, "rssi location trig pos x,y | %d,%d",
//                                   ble_ee_datas->rssi_loc_trig_pos[i][j],
//                                   ble_ee_datas->rssi_loc_trig_pos[i][j + 1]);
//                         j++;
//                     }

//                     if (ble_ee_datas->rssi_loc_in_control_mask[i][j / 2] & 0x80) // 开启了进入范围事件
//                     {
//                         esay_logi(TAG, "in this point will:");
//                         for (size_t k = 0; k < 7; k++)
//                         {
//                             if (ble_ee_datas->rssi_loc_in_control_mask[i][j / 2] & (1 << k))
//                             {
//                                 esay_logo("%s", control_list[k]);
//                             }
//                         }
//                         esay_logo("\n");
//                     }

//                     if (ble_ee_datas->rssi_loc_out_control_mask[i][j / 2] & 0x80) // 开启了离开范围事件
//                     {
//                         esay_logi(TAG, "out this point %d meter will:", ble_ee_datas->rssi_loc_err_meter[i][j / 2]);
//                         for (size_t k = 0; k < 7; k++)
//                         {
//                             if (ble_ee_datas->rssi_loc_out_control_mask[i][j / 2] & (1 << k))
//                             {
//                                 esay_logo("%s", control_list[k]);
//                             }
//                         }
//                         esay_logo("\n");
//                     }
//                 }
//             }
//         }
//     }
// }

// void drv_ble_set_scan_duration(uint16_t ms)
// {

//     GAPRole_ObserverCancelDiscovery();

//     scan_duration = ms;
//     GAP_SetParamValue(TGAP_DISC_SCAN, scan_duration);

//     if (ble_cu_data.ble_scan_state != BLE_STATE_IDLE)
//     {
//         tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(scan_time));
//     }
// }

// void drv_ble_add_white_list(uint8_t *mac)
// {
//     uint8_t zero_array[6] = {0, 0, 0, 0, 0, 0};
//     for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     {
//         if (memcmp(ble_ee_datas->white_list_mac[i], zero_array, 6) == 0)
//         {
//             memcpy(ble_ee_datas->white_list_mac[i], mac, 6);
//             update_white_list();
//             return;
//         }
//     }
// }

// void drv_ble_del_white_list(uint8_t *mac)
// {
//     for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     {
//         if (memcmp(ble_ee_datas->white_list_mac[i], mac, 6) == 0)
//         {
//             memset(ble_ee_datas->white_list_mac[i], 0, 6);
//             update_white_list();
//             return;
//         }
//     }
// }

// void drv_ble_set_state(ble_state_t state)
// {
//     ble_cu_data.ble_scan_state = state;
//     chek_scan_paras();
// }

// void drv_ble_refresh_state()
// {
//     for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     {
//         if (drv_public_datas_mac_chek(ble_ee_datas->white_list_mac[i]))
//         {
//             if (ble_cu_data.ble_scan_state != BLE_STATE_SCAN_SLOW && ble_cu_data.ble_scan_state != BLE_STATE_SCAN_FAST)
//                 drv_ble_set_state(BLE_STATE_SCAN_SLOW);
//             return;
//         }
//     }
//     drv_ble_set_state(BLE_STATE_IDLE);
// }

// void drv_ble_register_scan_cb(ble_scan_callback_t callback)
// {
//     scan_callback = callback;
// }

// static int data_unpack(const uint8_t *dat, uint8_t len, char *buffer)
// {
//     uint8_t chek_cnt = 0;
//     uint8_t size = 0;
//     while (1)
//     {
//         size = *dat++;
//         if (*dat == 0x09)
//         {
//             memcpy(buffer, dat + 1, size - 1);
//             buffer[size - 1] = 0;
//             return 1;
//         }
//         dat += size;
//         chek_cnt += size + 1;
//         if (chek_cnt >= len)
//             return 0;
//     }
// }

// void drv_ble_install()
// {
//     ble_datas = &drv_public_get_datas()->eeprom_datas.ble_datas;
//     memset(&ble_cu_data, 0, sizeof(ble_cu_data));

//     CH58X_BLEInit(); // 蓝牙初始化
//     HAL_Init();      // 蓝牙抽象层初始化
//     GAPRole_ObserverInit();
//     ObserverTaskId = TMOS_ProcessEventRegister(Observer_ProcessEvent); // 注册事件处理函数

//     // Setup Observer Profile
//     {
//         uint8_t scanRes = DEFAULT_MAX_SCAN_RES;
//         GAPRole_SetParameter(GAPROLE_MAX_SCAN_RES, sizeof(uint8_t), &scanRes);
//     }

//     // Setup GAP
//     GAP_SetParamValue(TGAP_DISC_SCAN, DEFAULT_SCAN_DURATION);
//     ee_datas_init();

//     // for (size_t i = 0; i < BLE_SNV_NUM; i++)
//     // {
//     //     if (drv_public_datas_mac_chek(ble_ee_datas->white_list_mac[i]))
//     //     {
//     //         LL_AddWhiteListDevice(0, ble_ee_datas->white_list_mac[i]);
//     //         esay_logi(TAG, "ble set white list mac %02X:%02X:%02X:%02X:%02X:%02X",
//     //                   ble_ee_datas->white_list_mac[i][0],
//     //                   ble_ee_datas->white_list_mac[i][1],
//     //                   ble_ee_datas->white_list_mac[i][2],
//     //                   ble_ee_datas->white_list_mac[i][3],
//     //                   ble_ee_datas->white_list_mac[i][4],
//     //                   ble_ee_datas->white_list_mac[i][5]);
//     //     }
//     // }

//     // esay_logi(TAG, "list add ret %d", (int)LL_AddWhiteListDevice(0, mac1));

//     uint8 filter_policy = GAP_FILTER_POLICY_ALL;                                    // 允许任何设备扫描，但只允许白名单中的设备连接。
//     GAPRole_SetParameter(GAPROLE_ADV_FILTER_POLICY, sizeof(uint8), &filter_policy); // 设置白名单

//     // Setup a delayed profile startup
//     tmos_set_event(ObserverTaskId, START_DEVICE_EVT);
// }

// uint16_t Observer_ProcessEvent(uint8_t task_id, uint16_t events)
// {
//     if (events & SYS_EVENT_MSG)
//     {
//         uint8_t *pMsg;
//         if ((pMsg = tmos_msg_receive(ObserverTaskId)) != NULL)
//         {
//             tmos_msg_deallocate(pMsg);
//         }
//         return (events ^ SYS_EVENT_MSG);
//     }

//     if (events & START_DEVICE_EVT)
//     {
//         GAPRole_ObserverStartDevice((gapRoleObserverCB_t *)&ObserverRoleCB);
//         return (events ^ START_DEVICE_EVT);
//     }

//     if (events & START_SCAN_EVT)
//     {
//         static const uint8_t zero_array[6] = {0, 0, 0, 0, 0, 0};

//         // drv_adc_update_temp_soc();

//         if (ble_cu_data.ble_scan_state != BLE_STATE_IDLE &&
//             ble_cu_data.ble_scan_state != BLE_STATE_SCAN_CONTINUOUS &&
//             memcmp(ble_ee_datas->white_list_mac, zero_array, 6) == 0) // 白名单为空   不扫描
//         {
//             // tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(30000));
//         }
//         else
//         {
//             GAPRole_ObserverStartDiscovery(DEFAULT_DISCOVERY_MODE,
//                                            DEFAULT_DISCOVERY_ACTIVE_SCAN,
//                                            wirte_list_en);
//         }

//         return (events ^ START_SCAN_EVT);
//     }

//     return 0;
// }

// static void ObserverEventCB(gapRoleEvent_t *pEvent)
// {
//     switch (pEvent->gap.opcode)
//     {

//     case GAP_DEVICE_INIT_DONE_EVENT:
//     {
//         chek_scan_paras();
//     }
//     break;
//     case GAP_DEVICE_INFO_EVENT:
//     {

//         // PRINT("Device %d : ", (int)pEvent->deviceInfo.rssi);
//         // for (int i = 0; i < 6; i++)
//         // {tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(scan_time));
//         //     PRINT("%x ", pEvent->deviceInfo.addr[i]);
//         // }
//         char buf[32];
//         if (data_unpack(pEvent->deviceInfo.pEvtData, pEvent->deviceInfo.dataLen, buf))
//         {
//             if (scan_callback != NULL)
//                 scan_callback(pEvent->deviceInfo.addr, buf, pEvent->deviceInfo.rssi);
//         }
//         else
//         {
//             if (scan_callback != NULL)
//                 scan_callback(pEvent->deviceInfo.addr, NULL, pEvent->deviceInfo.rssi);
//         }
//     }
//     break;

//     case GAP_DEVICE_DISCOVERY_EVENT:
//     {
//         if (ble_cu_data.ble_scan_state != BLE_STATE_IDLE)
//             tmos_start_task(ObserverTaskId, START_SCAN_EVT, MS1_TO_SYSTEM_TIME(scan_time));
//     }
//     break;

//     default:
//         break;
//     }
// }
